package singleton.example;

/**
 * Holder模式的饿汉模式
 * Hungry类被装载了，instance不一定被初始化，因为 HungryHolder 类没有被主动使用，
 * 只有显示通过调用 getInstance 方法时，才会显示装载 HungryHolder 类，
 * 从而实例化 instance。
 * 这里直接使用了类加载的原理
 * 一般饿汉模式，直接在Hungry里面定义 private static final Hungry gungry = new Hungry()
 *  这种因为用final修饰，直接在编译时期，存到类的常量池里面了。
 * 类的生命周期包括 加载-》验证-》准备-》解析-》初始化-》使用-》卸载
 * 加载-》验证-》准备-》初始化-》卸载这五个顺序是确定的，
 * 而本例中使用了类初始化的原理，当类的静态方法被调用或者使用类的静态字段的是触发类的初始化的条件。
 * 因为一个类在同一个类加载器中只能被加载一次，所以只有一个实例。
 *
 * 这里先是被加载，当调用Hungry.getInstance时才会初始化Hungry类，然后在里面调用HungryHolder.hungry时，
 * 才会初始化HungryHolder类，初始化时，静态变量和static{}都会被执行。所以这个实现了延迟加载。这里的加载指的是初始化。
 * Created by yangliwei on 2017/11/9.
 */
public class Hungry {
    private static class HungryHolder{
        private static Hungry hungry = new Hungry();
    }
    private Hungry(){

    };
    public static Hungry getInstance(){
        return HungryHolder.hungry;
    }
}
